从字符串访问IQueryable对象成员?

时间:2013-11-05 19:53:21

标签: c# asp.net-mvc iqueryable

我想制作一个仅以一种有意义的方式改变的功能模板。我目前正在创建单独的ActionResult来更改我的MVC应用程序中的用户设置。有很多选项,我已经厌倦了为每个复选框写出一个新的ActionResult方法所以我需要一些关于如何访问和设置值的方向,我没有用点表示法显式设置对象成员

这是一个当前复选框ActionResult的示例:

public ActionResult ChangeActivityShowNewProduct(bool value)
{
    var _id = Convert.ToInt32(Session["ID"]);
    var dataContext = new SecurityDataContext();
    var x = from c in dataContext.UserSettings
            where c.UserID == _id
            select c;

    foreach (var setting in x)
    {
        setting.ActivityShowNewProduct = value;
    }

    dataContext.SubmitChanges();

    Session["ActivityShowNewProduct"] = value;

    return Json(Session["ActivityShowNewProduct"], JsonRequestBehavior.AllowGet);
}

另一个例子非常相似但可能被称为" ChangeActivityShowNewUser"其中底层代码的唯一区别在于具有setting.ActivityShowNewUser的foreach循环(以及会话变量,但我并不担心分配那些)。

是否有使用字符串设置setting' s成员?也许是出于一个foreach循环?我对IQueryable对象并不十分熟悉,所以我不太清楚从哪里开始寻找。任何参考资料都将非常感谢!

更新


我们走了。它有效,但它有点重复,我正在研究它。张贴他人和/或批评。谢谢你们。

Func<int, bool, Action<UserSetting>, bool> CheckBoxChanger = (i, b, v) =>
{
    var _id = i;

    var dataContext = new SecurityDataContext();
    var x = from c in dataContext.UserSettings
            where c.UserID == _id
            select c;

    foreach (var setting in x)
    {
        v(setting);
    }

    dataContext.SubmitChanges();

    return b;
};

public ActionResult CheckBoxSettingChange(Action<UserSetting> valueSetter, bool result, string SessionName)
{
    Session[SessionName] = CheckBoxChanger(Convert.ToInt32(Session["ID"]), result, valueSetter);

    return Json(Session[SessionName], JsonRequestBehavior.AllowGet);
}

public void DoIt(string name, bool val)
{
    switch (name)
    {
        case "ChangeActivityShowNewProduct":
            CheckBoxSettingChange(setting => setting.ActivityShowNewProduct = val, val, name);
            break;

        // ... etc etc etc
    }
}

1 个答案:

答案 0 :(得分:2)

当你执行foreach循环时,它不再仅仅是一个查询;它已经实现了结果。

您可以让此方法接受一个获取项目并设置该值的方法。然后你可以在每个项目上调用该方法:

public ActionResult ChangeActivityShowNewProduct(Action<UserSetting> valueSetter)
{
    //...
    foreach (var setting in x)
        valueSetter(setting);
    //...
}

然后调用它你会有类似的东西:

ChangeActivityShowNewProduct(setting => setting.ActivityShowNewProduct = false);