【问题标题】:Extracting generic Linq queries提取通用 Linq 查询
【发布时间】:2009-07-08 12:31:34
【问题描述】:

我想在我的 Windows 窗体应用程序中使用 Linq to SQL。

本地数据库中的数据是从 Web 服务获取或在本地创建的。

如果一个实体是从 Web 服务中获取的,则它设置了 ExternalId

我经常需要使用如下代码通过他们的 ExternalId 获取对象:

var user = (from u in db.User
            where u.ExternalId == userExternalId
            select u).First();

var location = (from l in db.Location
            where l.ExternalId == locationExternalId
            select l).First();

所以我考虑将其更改为如下所示的通用函数:

internal TEntity FetchByExternalId<TEntity>(System.Data.Linq.Table<TEntity> table,
                                               int externalId) 
where TEntity: IExternalStorable
{
    return (from obj in table
            where obj.ExternalId == externalId
            select (TEntity)obj).First();
}

不幸的是这样的函数不能编译:

  1. 我无法将 IExternalStorable 添加到实体类,因为代码是从数据库生成的(我曾想过使用部分类,但它似乎不起作用)
  2. 它 C# 抱怨 TEntity 不是引用类型我不确定通用的“where”约束应该是什么样子。

任何想法如何在泛型函数中使用 linq?

【问题讨论】:

    标签: c# .net linq


    【解决方案1】:

    考虑利用框架而不是自行开发:

    Location location = db.Locations
      .First(loc => loc.ExternalId == locationExternalId);
    

    【讨论】:

      【解决方案2】:

      1:部分类确实应该工作。您是否检查过命名空间是否相同?你遇到了什么错误?

      2:应该是

      where TEntity : class, IExternalStorable
      

      否则它可能是另一个无法实例化的接口

      【讨论】:

      • Re: 1. 命名空间有问题 :) 谢谢。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-09-12
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2010-10-08
      相关资源
      最近更新 更多