2

我在 Web 表单中有四个按钮,它们的目的是分别加载第一条、上一条、下一条和最后一条记录。他们通过获取表单中加载的当前 ID 并根据需要执行此操作。我正在使用 Linq to SQL。下面是我用于 NEXT 记录的代码,如果我想按 ID 加载下一条记录,它可以正常工作。

var dx = new DataModelDataContext();
List<Dog> dogList = dx.Dogs.AsEnumerable().ToList();

try
{
    return
        dogList.SkipWhile(x => x.Id != dogId).Skip(1).FirstOrDefault().Id.ToString(
            CultureInfo.InvariantCulture);
}
catch
{
    return null;
}

我再说一遍,对于前面的场景,这段代码可以正常工作。

场景发生了变化,我现在必须根据包含表单属性(名字、姓氏、性别等)的下拉列表使用前面提到的按钮检索记录,所以它不再是一个函数目的是通过 ID 定位下一条记录。

我正在考虑创建一个 LoadNextRecord(searchParameter,TextboxValue) 以便根据下拉列表中指定的属性定位下一条记录。

但是,是否可以动态指定要比较数据的属性?

例如:x =>x.[searchParameter] != textboxvalue

我知道这可以使用动态 sql...但是我想知道是否可以使用 LINQ。

4

4 回答 4

4

如果您使用Dynamic Linq是可能的。通过在此处下载示例,您将在 zip 中的以下路径找到一个文件:LinqSamples\DynamicQuery\DynamicQuery\dynamic.cs. 通过添加该文件并正确使用,您可以获得一些IQueryable扩展方法,允许您以字符串格式表达条件。在 zip 中有关于如何使用的示例。使用此解决方案,您会遇到所谓的“魔术字符串”,但不是那么“魔术”,因为 linq 表达式是在幕后编译的。

于 2012-07-20T15:32:32.460 回答
1

您可以在基类上放置一个接口,该接口公开一个 searchParameter() 成员。

var searchValue = dogId;
return 
    dogList.SkipWhile(x => x.searchParameter() != searchValue).Skip(1).FirstOrDefault().Id.ToString(CultureInfo.InvariantCulture);
于 2012-07-20T15:36:09.543 回答
1

你可以使用反射

        var dx = new DataModelDataContext();
        List<Dog> dogList = dx.Dogs.AsEnumerable().ToList();

        string PropetyToCheck = "MyProperty";

        PropertyInfo property = typeof(Dog).GetProperty(PropetyToCheck);

        try
        {
            return
                dogList.SkipWhile(x => property.GetValue(x, null) != dogId).Skip(1).FirstOrDefault().Id.ToString(
                    CultureInfo.InvariantCulture);
        }
于 2012-07-20T15:36:39.470 回答
0

编辑**对不起,误读了问题,反思会更好。

编辑***

实际上,不,您可以将组合框绑定到一组具有谓词属性的对象,然后 onchange / button 事件(无论您使用什么来转到下一条记录),您都可以将对象从组合框中取出,并在里面使用它的谓词linq 方法。

这确实意味着为您要跳过的每个属性维护一组对象,但是如果您想向组合框添加另一个对象,则必须做一些工作。

Dictionary<string, Predicate<YourType>> filters = new ...
filters.Add("YourProp", x => x.yourProp == "blah blah");

Combobox box = new ...
box.ValueMember = "Value";
box.DispayMember = "Key";
box.DataSource = filters;

var pred = box.SelectedValue as Predicate<YourType>;
if (pred != null)
{
    GoToNextRecord(pred);
}

然后在linq方法中......

dogs...Skip(pred)...;
于 2012-07-20T15:35:29.113 回答