我有一些表都有相同的列domainID
,基本上只控制哪些数据显示在哪个网站上,因为它们共享一个数据库。
因此,当我将表数据绑定到控件时,我需要创建一个大型开关来处理不同的LINQ查询。我想创建一个实用程序方法,它将表类型作为参数,然后根据传递的表中的列返回where子句。
public static IEnumerable<T> ExecuteInContext<T>(
IQueryable<T> src)
{
int domain = 1;//hard coded for example
return src.Where(x => x.DomainID == domain);//Won't work, has to be a way to do this.
}
我坚持返回代码。你不能简单地构造一个像我现在这样的where子句,因为它不知道我在说什么表。
我试图像这样调用第一种方法:
using (DataClasses1DataContext db = new DataClasses1DataContext())
{
var q = Utility.ExecuteInContext(db.GetTable<item>());
Repeater1.DataSource = q;
Repeater1.DataBind();
}
我希望这能解释我正在尝试做什么。
编辑: BrokenGlass的答案解决了我的问题。我想补充一点,您需要打开.dbml.cs文件并使用您的界面扩展表/类。我还想指出,如果我的列可以为空,那么项目就不会构建,它说它与我的界面的返回类型不同。
答案 0 :(得分:3)
您必须将T
限制为具有DomainID
属性的类 - 您可以在扩展数据模型的部分类中添加这些接口实现。
public interface IFoo
{
int DomainId { get; set; }
}
..
public static IQueryable<T> ExecuteInContext<T>(IQueryable<T> src) where T: IFoo
{
int domain = 1;//hard coded for example
return src.Where(x => x.DomainID == domain);
}
答案 1 :(得分:2)
Expression pe = Expression.Parameter(typeof(T));
Expression prope = Expression.Property(pe, "DomainID");
Expression ce = Expression.Equals(prope,
Expression.Constant((int)1);
Expression<Func<T,bool>> exp =
Expression.Lambda<Func<T,bool>>(
ce, pe);
return query.Where(exp);
答案 2 :(得分:0)
您应该能够将通用参数转换为预期类型...
public static IEnumerable<T> ExecuteInContext<T>(IQueryable<T> src)
{
int domain = 1;//hard coded for example
return src.Where(x => ((T)x).DomainID == domain);
}
但是你意识到你已经创建了一个泛型方法,假设它的类型参数总是暴露一个特定的属性?如果您要这样做,则应该应用generic type constraint,以便T始终从具有该属性的类型派生...
例如:
public static IEnumerable<T> ExecuteInContext<T>(IQueryable<T> src) where T : IMyDomainObject
答案 3 :(得分:0)
我不确定我是否明白你的意思,但也许你想添加一个where子句:
public static IEnumerable<T> ExecuteInContext<T>(IQueryable<T> src)
where T: MyType //MyType exposing your DomainId
{
int domain = 1;//hard coded for example
return src.Where(x => x.DomainID == domain);//Won't work, has to be a way to do this.
}