问题:我想多个组件之间共享代码。 这种共享的代码将需要使用LINQ合作,SQL映射类。
我遇到同样的问题找到这里 ,但我也发现了一个变通办法,我觉得麻烦(我不会那么远,说“错误”)。
所有下面的代码可以在下载该解决方案 。
鉴于此表:
create table Users
(
Id int identity(1,1) not null constraint PK_Users primary key
, Name nvarchar(40) not null
, Email nvarchar(100) not null
)
这DBML映射:
<Table Name="dbo.Users" Member="Users">
<Type Name="User">
<Column Name="Id" Modifier="Override" Type="System.Int32" DbType="Int NOT NULL IDENTITY" IsPrimaryKey="true" IsDbGenerated="true" CanBeNull="false" />
<Column Name="Name" Modifier="Override" Type="System.String" DbType="NVarChar(40) NOT NULL" CanBeNull="false" />
<Column Name="Email" Modifier="Override" Type="System.String" DbType="NVarChar(100) NOT NULL" CanBeNull="false" />
</Type>
</Table>
我已经创建了下面的基类中的一个组件“共享”:
namespace TestLinq2Sql.Shared
{
public abstract class UserBase
{
public abstract int Id { get; set; }
public abstract string Name { get; set; }
public abstract string Email { get; set; }
}
public abstract class UserBase<TUser> : UserBase where TUser : UserBase
{
public static TUser FindByName_Broken(DataContext db, string name)
{
return db.GetTable<TUser>().FirstOrDefault(u => u.Name == name);
}
public static TUser FindByName_Works(DataContext db, string name)
{
return db.GetTable<TUser>().FirstOrDefault(u => u.Name == name && 1 == 1);
}
public static TUser FindByNameEmail_Works(DataContext db, string name, string email)
{
return db.GetTable<TUser>().FirstOrDefault(u => u.Name == name || u.Email == email);
}
}
}
这些类是在另一个组件“主”引用,就像这样:
namespace TestLinq2Sql
{
partial class User : TestLinq2Sql.Shared.UserBase<User>
{
}
}
该DBML文件位于“主”装配,以及。
当调用User.FindByName_Broken(db, "test")
抛出一个异常:
System.InvalidOperationException:类构件UserBase.Name是未映射的。
然而,另外两个基地的静态方法的工作。
此外,通过调用生成的SQL User.FindByName_Works(db, "test")
是我们所希望看到的在破碎的呼叫:
SELECT TOP (1) [t0].[Id], [t0].[Name], [t0].[Email]
FROM [dbo].[Users] AS [t0]
WHERE [t0].[Name] = @p0
-- @p0: Input NVarChar (Size = 4; Prec = 0; Scale = 0) [test]
虽然我愿意用这1 == 1
“黑客”对单个预测查询,是否有对基/共享/核心组件共享的LINQ to SQL数据的相关代码更好的办法?