相关疑难解决方法(0)

C#LINQ to SQL:重构此通用GetByID方法

我写了以下方法.

public T GetByID(int id)
{
    var dbcontext = DB;
    var table = dbcontext.GetTable<T>();
    return table.ToList().SingleOrDefault(e => Convert.ToInt16(e.GetType().GetProperties().First().GetValue(e, null)) == id);
}
Run Code Online (Sandbox Code Playgroud)

基本上它是Generic类中的一个方法,它T是DataContext中的一个类.

该方法从T(GetTable)类型获取表,并检查输入参数的第一个属性(始终是ID).

这个问题是我必须首先将元素表转换为列表以GetType在属性上执行a ,但这不是很方便,因为必须枚举表的所有元素并将其转换为a List.

我怎样才能重构这个方法以避免ToList整个表格?

[更新]

我无法Where直接在表上执行的原因是因为我收到此异常:

方法'System.Reflection.PropertyInfo [] GetProperties()'没有支持的SQL转换.

因为GetProperties无法翻译成SQL.

[更新]

有些人建议使用T接口,但问题是该T参数将是[DataContextName] .designer.cs中自动生成的类,因此我无法使其实现接口(并且它不可行实现LINQ的所有这些"数据库类"的接口;并且,一旦我向DataContext添加新表,就会重新生成文件,从而丢失所有写入的数据).

所以,必须有一个更好的方法来做到这一点......

[更新]

我现在已经按照Neil Williams的建议实现了我的代码,但我仍然遇到问题.以下是代码的摘录:

接口:

public interface IHasID
{
    int ID { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

DataContext [查看代码]:

namespace MusicRepo_DataContext
{
    partial …
Run Code Online (Sandbox Code Playgroud)

c# generics expression-trees linq-to-sql

21
推荐指数
1
解决办法
1万
查看次数

如何根据动态字段名引用Linq中的字段

首先,为糟糕的问题标题道歉 - 不完全确定我是否正在问正确的事情.

通常我可以执行以下操作来访问字段:

MyTables table = dc.MyTables.SingleOrDefault(p => p.id == someId);
somevalue = table.samplefield;
Run Code Online (Sandbox Code Playgroud)

在这种情况下,变量somevalue最终将具有字段samplefield的值.

现在我有一个场景,我想填充一个变量,但我不知道设计时表字段的名称.但是,我将此字段名称放在字符串中.因此可以使用此字符串获取值吗?

希望这是有道理的!

c# linq

7
推荐指数
1
解决办法
4277
查看次数

标签 统计

c# ×2

expression-trees ×1

generics ×1

linq ×1

linq-to-sql ×1