Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/270.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用抽象基类时LINQ到SQL映射异常_C#_Linq To Sql_Abstract Class - Fatal编程技术网

C# 使用抽象基类时LINQ到SQL映射异常

C# 使用抽象基类时LINQ到SQL映射异常,c#,linq-to-sql,abstract-class,C#,Linq To Sql,Abstract Class,问题:我想在多个程序集之间共享代码。此共享代码将需要使用LINQ到SQL映射类 我遇到了相同的问题,但我也发现了一个让我感到困扰的工作(我不会说“bug”) 可以在中下载以下所有代码。 鉴于此表: create table Users ( Id int identity(1,1) not null constraint PK_Users primary key , Name nvarchar(40) not null , Email nvarchar(100) not

问题:我想在多个程序集之间共享代码。此共享代码将需要使用LINQ到SQL映射类

我遇到了相同的问题,但我也发现了一个让我感到困扰的工作(我不会说“bug”)

可以在中下载以下所有代码。

鉴于此表:

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>

虽然我愿意将这个
1==1
的“hack”用于单谓词查询,但有没有更好的方法在基本/共享/核心程序集中共享LINQ到SQL感知代码?

您在这里问了几个问题,Jarrod,您能更具体一点吗?也就是说,您是否只想知道方法失败的原因?或者,您想要一种跨不同项目使用数据对象的方法?我假设您没有尝试使用LINQ到SQL作为数据库映射层,而是将其用作域模型?在这种情况下,两个应用程序是否实现相同的域(业务流程、验证等)?

我很幸运地在共享程序集中定义了数据类,并在多个程序集中使用它们,而不是将多个程序集的数据类映射到共享协定。使用示例名称空间,将自定义DataContext和共享数据类放在TestLinq2Sql中。共享:

namespace TestLinq2Sql.Shared
{
    public class SharedContext : DataContext
    {
        public Table<User> Users;
        public SharedContext (string connectionString) : base(connectionString) { }
    }

    [Table(Name = "Users")]
    public class User
    {
        [Column(DbType = "Int NOT NULL IDENTITY", IsPrimaryKey=true, CanBeNull = false)]
        public int Id { get; set; }

        [Column(DbType = "nvarchar(40)", CanBeNull = false)]
        public string Name { get; set; }

        [Column(DbType = "nvarchar(100)", CanBeNull = false)]
        public string Email { get; set; }
    }
}

我在过去多次遇到这个问题,因为我们公司使用的框架中有一个类似的体系结构。您可能已经注意到,如果使用声明式LINQ查询,您将不会遇到这个问题。例如,以下代码将起作用:

return (from i in db.GetTable<TUser>() where i.Name = "Something").FirstOrDefault();
返回(从db.GetTable()中的i开始,其中i.Name=“Something”).FirstOrDefault();
但是,由于我们使用的是动态过滤器表达式,因此无法使用此方法。另一种解决方案是使用如下内容:

return db.GetTable<TUser>().Select(i => i).Where(i => i.Name == "Something").SingleOrDefault();
return db.GetTable().Select(i=>i).Where(i=>i.Name==“Something”).SingleOrDefault();
这个解决方案解决了我们的问题,因为我们可以在几乎所有表达式的开头插入“.Select(i=>i)”。这将导致Linq引擎不查看映射的基类,并将强制它查看实际的实体类并找到映射


希望它能有所帮助

这看起来像个bug-我们在主键上使用了一个特殊的case Single来进行本地查找,但是看起来这个代码路径没有正确地获取元数据


1=1 hack意味着它通过正常的数据库往返,但实际上应该提交一个bug…

尝试包含OfType before Where子句


return\u dbContext.GetTable().OfType().Where(expression.ToList()

实际上,它看起来已经存在一个bug报告——状态为“已关闭,无法修复”。:(它在没有where子句的情况下进行查询,然后在内存中过滤列表。这对很多结果都不好;哇,这是唯一适合我的解决方案,非常感谢您发布此消息。
namespace TestLinq2Sql.Shared
{
    public class SharedContext : DataContext
    {
        public Table<User> Users;
        public SharedContext (string connectionString) : base(connectionString) { }
    }

    [Table(Name = "Users")]
    public class User
    {
        [Column(DbType = "Int NOT NULL IDENTITY", IsPrimaryKey=true, CanBeNull = false)]
        public int Id { get; set; }

        [Column(DbType = "nvarchar(40)", CanBeNull = false)]
        public string Name { get; set; }

        [Column(DbType = "nvarchar(100)", CanBeNull = false)]
        public string Email { get; set; }
    }
}
using (TestLinq2Sql.Shared.SharedContext shared = 
    new TestLinq2Sql.Shared.SharedContext(
        ConfigurationManager.ConnectionStrings["myConnString"].ConnectionString))
{
    var user = shared.Users.FirstOrDefault(u => u.Name == "test");
}  
return (from i in db.GetTable<TUser>() where i.Name = "Something").FirstOrDefault();
return db.GetTable<TUser>().Select(i => i).Where(i => i.Name == "Something").SingleOrDefault();